import 'dart:async';

import 'package:flutter/services.dart';
import 'package:plugin_native/data/flutter_markers_location_entity.dart';

/// 地图通信中心
class TianDiMapController {
  /// 通信信道
  MethodChannel _channel;

  TianDiMapController(int id) : _channel = new MethodChannel('mapView_$id');

  ///覆盖图层点击事件的回调
  void Function(String tag)? onPolygonClick;
  void Function(String tag)? onInfoWindowClick;

  void setMethodChannelHandler(Future<dynamic> handler(MethodCall call)) {
    _channel.setMethodCallHandler(handler);
  }

  ///清空点击事件
  void clearAllClickListener() {
    onPolygonClick = null;
    onInfoWindowClick = null;
  }

  ///设置地块的点击事件
  Future<void> addOnPolygonClickListener(
    void Function(String tag) onClick,
  ) async {
    this.onPolygonClick = onClick;
    return _channel.invokeMethod('addOnPolygonClickListener');
  }

  ///添加infoWindow的点击事件
  Future<void> addOnInfoWindowClickListener(
    void Function(String tag) onClick,
  ) async {
    this.onInfoWindowClick = onClick;
    return _channel.invokeMethod('addOnInfoWindowClickListener');
  }

  ///设置地图中心
  Future<void> setMapCenter({
    required double latitude, //纬度
    required double longitude, //经度
    required int zoom, //缩放级别
  }) async {
    return _channel.invokeMethod('setMapCenter', {
      'latitude': latitude,
      'longitude': longitude,
      'zoom': zoom,
    });
  }

  ///添加infoWindow
  Future<void> addInfoWindow({
    required double latitude, //纬度
    required double longitude, //经度
    required String msg, //展示的内容
    String desc = "",
    String tag = "InfoWindow", //控件的标签
  }) async {
    return _channel.invokeMethod('addInfoWindow', {
      'latitude': latitude,
      'longitude': longitude,
      'msg': msg,
      'desc': desc,
      'tag': tag,
    });
  }

  ///显示当前定位
  Future<dynamic> showLocation({
    required double latitude, //纬度
    required double longitude, //经度
  }) async {
    return _channel.invokeMethod('showLocation');
  }

  ///缩放地图到指定的缩放级别
  Future<dynamic> zoomToLevel({
    required int level, // level: 等级 1-18
  }) async {
    return _channel.invokeMethod('zoomToLevel', {"level": level});
  }

  ///地图上绘制多个点,每次绘制会清空掉之前的点
  Future<dynamic> addMarkers({
    required List<MarkersLocation> markers,
  }) async {
    return _channel.invokeMethod('addMarkers', {
      'markers': markers.map((marker) => marker.toMap()).toList() as dynamic
    });
  }

  ///地图上绘制点,单个点,注意,添加新的mark点会清空旧的mark点,如需添加多个使用addMarkers
  Future<dynamic> addMarker({
    required double latitude, //纬度
    required double longitude, //经度
  }) async {
    return _channel.invokeMethod(
        'addMarker', {'latitude': latitude, 'longitude': longitude});
  }

  ///地图上绘制封闭的区域(地块信息)
  ///tag:为每个地块添加一个ID，用于点击回调，如果没有地块的点击事件需求，则可以不设置
  ///使用默认的值
  Future<dynamic> addArea({
    required List<MarkersLocation> points,
    required String color,
    String tag = "farmArea",
  }) async {
    return _channel.invokeMethod('addArea', {
      'points': points.map((marker) => marker.toMap()).toList() as dynamic,
      "color": color,
      "tag": tag,
    });
  }

  ///清除地图上的地块信息
  Future<dynamic> clearAreas() async {
    return _channel.invokeMethod("clearAreas");
  }

  ///清除地图上的点
  Future<dynamic> clearMarkers() async {
    return _channel.invokeMethod("clearMarkers");
  }
}
